package com.bdqn.demo;

import com.bdqn.pojo.Student;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

/**
 * 示例5：通过反射获取类的实例（对象）
 *
 * @author LILIBO
 * @since 2022-09-15
 */
public class Demo05 {

    public static void main(String[] args) {
        // 通过Class.forName()方法获取Class
        Class clazz = null;
        try {
            clazz = Class.forName("com.bdqn.pojo.Student");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        // 通过反射创建类的对象
        try {
            System.out.println("通过反射创建类的对象: ");
            // 通过反射创建类的实例（对象） newInstance()
            Object obj01 = clazz.newInstance();
            System.out.println(obj01);

            System.out.println("通过构造函数创建对象: ");
            // 获取某个构造函数
            Constructor constructor = clazz.getDeclaredConstructor(String.class, int.class, String.class);
            // 上帝视角，跨过访问权限调用（原来private的方法此处已超出访问限制，但是通过setAccessible(true)可以设定为可访问！）
            constructor.setAccessible(true);
            // 通过构造函数创建对象（传递构造函数需要的参数）
            Object obj02 = constructor.newInstance("张三", 18, "湖南郴州");
            System.out.println(((Student) obj02).getName());
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }

}
